package ShortestPath;

import Main.Main;
public class ShortestPath_DIJ {
    public static int[] dijkstra ( int[][] weight, int begin,int end){
        // 接受一个图的权重矩阵，和一个起点编号start（从0编号，顶点存在数组中）
        // 返回一个int[] 数组，表示从start到它的最短路径长度
        int n = weight.length; // 顶点个数
        int[] shortPath = new int[n]; // 存start到其他各点的最短路径
        String[] path = new String[n]; // 存start到其他各点最短路径的字符串表示
        for (int i = 0; i < n; i++)
            path[i] = new String(begin + "-->" + i);
        int[] visited = new int[n]; // 标记当前该顶点的最短路径是否已经求出,1表示已求出

        // 初始化，第一个顶点已经求出
        shortPath[begin] = 0;
        visited[begin] = 1;
        for (int count = 1; count < n; count++) { // 要加入n-1个顶点
            int k = -1; // 选出一个距离初始顶点start最近的未标记顶点
            int dmin = Integer.MAX_VALUE;
            for (int i = 0; i < n; i++) {
                if (visited[i] == 0 && weight[begin][i] < dmin) {
                    dmin = weight[begin][i];
                    k = i;
                }
            }

            // 将新选出的顶点标记为已求出最短路径，且到start的最短路径就是dmin
            shortPath[k] = dmin;
            visited[k] = 1;

            // 以k为中间点，修正从start到未访问各点的距离
            for (int i = 0; i < n; i++) {
                //如果 '起始点到当前点距离' + '当前点到某点距离' < '起始点到某点距离', 则更新
                if (visited[i] == 0 && weight[begin][k] + weight[k][i] < weight[begin][i]) {
                    weight[begin][i] = weight[begin][k] + weight[k][i];
                    path[i] = path[k] + "-->" + i;
                }
            }
        }



            System.out.println("从" + begin + "号城市开始出发到" + end + "号城市的最短路径为：" + path[end]);
        
        
        return shortPath;
    }
}